<?php

/**
 * +--------------------------------------------------------------
 * | eLuoPHP
 * +--------------------------------------------------------------
 * | Copyright (c) 2016-2018 http://qxwoo.cn All rights reserved.
 * +--------------------------------------------------------------
 * | y139w [y139w@163.com]
 * +--------------------------------------------------------------
 * | 数据工厂类文件
 * +--------------------------------------------------------------
 */

namespace luo;

use luo\exception\DbException;
use luo\ioc\Ioc;

class Db
{

    /**
     * 数据库实例对象数组
     * @var array
     */
    private static $_instances = [];

    /**
     * 实例化数据库
     * @param array $config
     * @param int $name
     * @return mixed
     * @throws \ReflectionException
     */
    public static function connect(array $config = [], $name = 0){

        $config = array_merge(Config::get('database'), $config);
        // 设置数据库配置项
        Config::set('database', $config);

        if($name === 0){
            $name = md5(json_encode($config));
        }

        if(!isset(self::$_instances[$name])){

            // 数据库类型
            $type = ucwords($config['type']);
            // 数据库驱动类
            $class = '\\luo\\db\\driver\\' . $type;
            // 获取数据库实例对象
            self::$_instances[$name] = Ioc::instance($class);

        }

        // 返回数据库实例对象
        return self::$_instances[$name];

    }

    /**
     * 静态方法调用数据库连接类中的方法
     * @param $name
     * @param $arguments
     * @return mixed
     * @throws DbException
     * @throws \ReflectionException
     */
    public static function __callStatic($name, $arguments)
    {

        // 获取Query对象
        $query = Ioc::instance('\\luo\\db\\Query');
        if(method_exists(get_class(self::connect()), $name)){
            // 调用Connection对象中的方法
            $exec = call_user_func_array([self::connect(), $name], $arguments);
        }elseif(method_exists(get_class($query), $name)){
            // 调用Query对象中的方法
            $exec = call_user_func_array([$query, $name], $arguments);
        }else{
            // 抛出异常
            throw new DbException('方法不存在');
        }

        return $exec;

    }

}